package com.zhu.classpath.entry.base;

import com.zhu.utils.ClassNameUtil;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

//jar包class文件提取器
public class JarEntry extends BaseEntry{
    private ZipFile zipFile;
    //ZipFile 是 Java 标准库中用于读取 ZIP/JAR 文件的核心类。它代表一个已打开的 JAR 文件
    private JarEntry(String path) {
        super(path);
        try {
            //absPath JAR 文件本身的路径（在文件系统中） "C:\myproject\libs\guava.jar"
            //zipFile 表示“已打开的 JAR 文件”，可以读取里面的内容
            this.zipFile = new ZipFile(this.absPath);
        } catch (Exception e) {
            throw new IllegalArgumentException("Cannot open JAR file: " + path, e);
        }
    }

    public static JarEntry createJarEntry(String path){
        if (path ==null || path.isEmpty()){
            return null;
        }
        return new JarEntry(path);
    }

    /**
     正确：使用 java.util.zip.ZipEntry
     在已打开的 JAR 文件中，查找名为 className 的条目
     比如查找 "com/google/common/collect/Lists.class"
     如果找到，返回一个 java.util.zip.ZipEntry 对象（代表 JAR 包里的一个文件）
     className 必须是 JAR 包内的相对路径，格式为：目录/子目录/文件名 com/mycompany/MyClass.class"
     */
    @Override
    public InputStream readClass(String className) {
        // 参数校验
        if (className == null || className.isEmpty()) {
            return null;
        }
        className = ClassNameUtil.normalizeClassName(className);
        ZipEntry entry = this.zipFile.getEntry(className);
        if (entry != null) {
            try {
                return zipFile.getInputStream(entry);
            } catch (Exception e) {
                return null;
            }
        }
        return null;
    }

}
